<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>如何修改原型？</title>
    <script>
        /* 
            如何修改原型对象？
                大部分情况下，我们是不需要修改原型对象的

                注意，千万不要通过类的实例来修改原型，
                    1.这样会通过一个对象，影响了所有同类对象。
                    2.修改原型显得创建实例，很麻烦
                    3.危险性高

                    一般是通过类来访问类的实例原型来进行修改
                    类名.prototype.属性（属性名=属性值）

                    好处：
                    一旦修改就是修改了所有类的实例原型对象（这点通过两种方法都一样），
                    这样通过类，无需实例通过类就可以修改实例的原型。

                    原则：
                    原型尽量不要修改，要改也最好通过类访问的方法来改。
                    最好不要直接给prototype去赋值，会将原来的原型覆盖掉，影响继承问题。
        */
       class Person{
        constructor(a,b,c){
            this.name=a
            this.age=b
            this.gender=c
        }
        sayhello(){
            console.log(this.name)
        }
       }

       const p1=new Person('小李',28,'男')      //  p1的原型也是p2的原型，也是所有Person类实例的原型
       const p2=new Person('小龙',28,'女')
       console.log(p1.__proto__)        //通过类的实例来访问Person类实例的原型

       //通过对象修改原型，往原型中添加方法，修改后所有的同类实例都能访问该方法，这样p1有run方法，导致所有的Person实例都有该方法
    //    p1.__proto__.run=()=>{
    //     console.log('修改原型')
    //    }
    //    console.log(p1)
    //    p2.run()

       // 通过类的prototype来访问原型

       console.log(Person.prototype)  // 通过类来访问该类的实例对象

        //  通过类来修改实例的原型
            Person.prototype.fly=()=>{
            console.log('通过类来修改实例的原型')
        }
        p1.fly()
     </script>
</head>
<body>
    
</body>
</html>